/* EVENTS.C */

#include <p_std.h>
#include <p_file.h>
#include <p_cons.h>
#include <epoc.h>
#include <wskeys.h>


LOCAL_D VOID *timH;
LOCAL_D WORD timstat;
LOCAL_D WORD counter;
LOCAL_D ULONG timint;

LOCAL_D VOID *conH;
LOCAL_D WORD keystat;
LOCAL_D P_CON_KBREC key;

#define MAX_COUNT   100


LOCAL_C VOID QueueKey(VOID)
    {
    p_ioa4(conH,P_FREAD,&keystat,&key);
    }

LOCAL_C VOID QueueTimer(VOID)
    {
    p_ioa4(timH,P_FRELATIVE,&timstat,&timint);
    }

LOCAL_C VOID CancelTimer(VOID)
    {
    p_iow2(timH,P_FCANCEL);
    p_waitstat(&timstat);
    }

LOCAL_C VOID Check(INT val,TEXT *msg)
    {
    TEXT buf[30];

    if (!val)
        return;
    p_atos(&buf[0],"Failed to open %s",msg);
    p_notifyerr(val,&buf[0],0,0,0);
    p_exit(0);
    }

LOCAL_C VOID OpenTimer(VOID)
    {
    Check(p_open(&timH,"TIM:",-1),"timer");
    }

LOCAL_C VOID OpenConsole(VOID)
    {
    P_RECT rect;
    WORD func;

    Check(p_open(&conH,"CON:",-1),"console");
    rect.tl.x=rect.tl.y=0;
    rect.br.x=25;
    rect.br.y=9;
    func=P_SCR_WSET;
    Check(p_iow4(conH,P_FSET,&func,&rect),"console");
    }

LOCAL_C VOID SetTimInt(INT new)
    {
    CancelTimer();
    timint=new;
    QueueTimer();
    }

LOCAL_C VOID Write(INT x,INT y,TEXT *pb,INT len)
    {
    P_POINT pos;
    WORD func;

    pos.x=x;
    pos.y=y;
    func=P_SCR_POSA;
    p_iow4(conH,P_FSET,&func,&pos);
    p_write(conH,pb,len);
    }

LOCAL_C VOID DisplayCount(VOID)
    {
    TEXT buf[4];

    p_atos(&buf[0],"%3d",counter);
    Write(10,2,&buf[0],3);
    }

LOCAL_C VOID DrawBorder(VOID)
    {
    TEXT buf[26];
    INT i;

    p_bfil(&buf[0],26,'*');
    Write(0,0,&buf[0],25);
    for (i=1; i<8; i++)
        {
        Write(0,i,&buf[0],1);
        Write(24,i,&buf[0],1);
        }
    Write(0,8,&buf[0],25);
    }

GLDEF_C VOID main(VOID)
    {
    OpenConsole();
    DrawBorder();
    OpenTimer();
    timint=10;
    QueueTimer();
    QueueKey();
    FOREVER
        {
        p_iowait();
        if (keystat!=E_FILE_PENDING)
            {
            if (key.keycode==W_KEY_ESCAPE)
                p_exit(0);
            if (key.keycode>='1' && key.keycode<='9')
                SetTimInt(2*(key.keycode-'0'));
            QueueKey();
            }
        else if (timstat!=E_FILE_PENDING)
            {
            if (counter++==MAX_COUNT)
                counter=1;
            DisplayCount();
            QueueTimer();
            }
        }
    }
